\begin{problem}{СНМ}{snm.in}{snm.out}{2 секунды}{256 мегабайт}

Ваша задача --- реализовать {\bf Persistent Disjoint-Set-Union}.
Что это значит?

Про {\bf Disjoint-Set-Union}:

Изначально у вас есть $n$ элементов. Нужно научиться отвечать на 2 типа запросов.

\begin{itemize}
  \setlength{\parskip}{-4pt}
  \setlength{\itemsep}{5pt}
  \item{\t{+ a b} --- объединить множества, в которых лежат вершины $a$ и $b$}
  \item{\t{? a b} --- сказать, лежат ли вершины $a$ и $b$ сейчас в одном множестве}
\end{itemize}

Про {\bf Persistent}:

Теперь у нас будет несколько копий (версий) структуры данных {\bf Disjoint-Set-Union}.

Запросы будут выглядеть так:

\begin{itemize}
  \setlength{\parskip}{-4pt}
  \setlength{\itemsep}{5pt}
  \item{\t{+ i a b} --- запрос к $i$-й структуре, объединить множества, в которых лежат вершины $a$ и $b$.
    При этом $i$-я структура остается не изменной, создается новая версия, ей присваивается новый номер (какой? читайте дальше)}
  \item{\t{? i a b} --- запрос к $i$-й структуре, сказать, лежат ли вершины $a$ и $b$ сейчас в одном множестве}
\end{itemize}

\InputFile

На первой строке 2 числа $N$ ($1 \le N \le 10^5$) и $K$ ($0 \le K \le 10^5$) --- 
число элементов и число запросов. Изначально все элементы находятся в различных множествах.
Эта изначальная копия (версия) структуры имеет номер $0$.

Далее следуют $K$ строк, на каждой описание очередного запроса. Формат запросов описан выше.
Запросы нумеруются целыми числами от $1$ до $K$. 

При обработки $j$-го запроса вида \t{+ i a b}, новая версия получит номер $j$.

\OutputFile

Для каждого запроса вида \t{? i a b} на отдельной строке нужно вывести \t{YES} или \t{NO}.
\Example

\begin{example}%
\exmp{%
4 7
+ 0 1 2
? 0 1 2
? 1 1 2
+ 1 2 3
? 4 3 1
? 0 4 4
? 4 1 4
}{%
NO
YES
YES
YES
NO
}%
\end{example}

\end{problem}
